﻿using Common.Entity;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Common.SqlSugar
{
    public class SqlSugarHelper //不能是泛型类
    {
        public static SqlSugarHelper Instance = new SqlSugarHelper();
        //多库情况下使用说明：
        //如果是固定多库可以传 new SqlSugarScope(List<ConnectionConfig>,db=>{}) 文档：多租户
        //如果是不固定多库 可以看文档Saas分库
        //用单例模式
        public SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig()
        {
            ConnectionString = "DataSource=data.db",//连接符字串
            DbType = DbType.Sqlite,//数据库类型
            IsAutoCloseConnection = true //不设成true要手动close
        },
      db =>
      {
          //(A)全局生效配置点，一般AOP和程序启动的配置扔这里面 ，所有上下文生效
          //调试SQL事件，可以删掉
          db.Aop.OnLogExecuting = (sql, pars) =>
          {

              //获取原生SQL推荐 5.1.4.63  性能OK
              Console.WriteLine(UtilMethods.GetNativeSql(sql, pars));

              //获取无参数化SQL 对性能有影响，特别大的SQL参数多的，调试使用
              //Console.WriteLine(UtilMethods.GetSqlString(DbType.SqlServer,sql,pars))

          };

          //多个配置就写下面
          //db.Ado.IsDisableMasterSlaveSeparation=true;

          //注意多租户 有几个设置几个
          //db.GetConnection(i).Aop
      });

        public void Init()
        {
            //建库
        
            Db.DbMaintenance.CreateDatabase();//达梦和Oracle不支持建库
         
            //建表 （看文档迁移）
            //Db.CodeFirst.InitTables<Dish>(); //所有库都支持
            //Db.CodeFirst.InitTables<Station>(); //所有库都支持
            // 获取命名空间下的所有类
            var assembly = Assembly.GetExecutingAssembly();
            var types = assembly.GetTypes()
                                .Where(t => t.Namespace == "Common.Entity") // 替换为你要扫描的命名空间
                                .ToList();
            // 将每个类对应的表创建到数据库中
            foreach (var type in types)
            {
                if (type.IsClass)
                {
                    // 创建表，如果表不存在
                    Db.CodeFirst.InitTables(type);
                    Console.WriteLine($"已创建表: {type.Name}");
                }
            }
        }
    }
}
